package com.ruoyi.movie.mapper;

import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.movie.domain.MovieBasics;
import com.ruoyi.movie.dto.MovieQueryDTO;

/**
 * 影视基础信息Mapper接口
 *
 * @author ruoyi
 * @date 2025-10-27
 */
public interface MovieBasicsMapper
{
    /**
     * 查询影视基础信息
     *
     * @param movieBasicsId 影视基础信息主键
     * @return 影视基础信息
     */
    public MovieBasics selectMovieBasicsById(Integer movieBasicsId);

    /**
     * 查询影视基础信息列表
     *
     * @param movieBasics 影视基础信息
     * @return 影视基础信息集合
     */
    public List<MovieBasics> selectMovieBasicsList(MovieBasics movieBasics);

    /**
     * 新增影视基础信息
     *
     * @param movieBasics 影视基础信息
     * @return 结果
     */
    public int insertMovieBasics(MovieBasics movieBasics);

    /**
     * 修改影视基础信息
     *
     * @param movieBasics 影视基础信息
     * @return 结果
     */
    public int updateMovieBasics(MovieBasics movieBasics);

    /**
     * 删除影视基础信息
     *
     * @param movieBasicsId 影视基础信息主键
     * @return 结果
     */
    public int deleteMovieBasicsById(Integer movieBasicsId);

    /**
     * 批量删除影视基础信息
     *
     * @param movieBasicsIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteMovieBasicsByIds(Integer[] movieBasicsIds);

    /**
     * 查询热门影视列表（按访问量排序）
     *
     * @param movieBasics 影视基础信息
     * @return 影视基础信息集合
     */
    public List<MovieBasics> selectHotMovieList(MovieBasics movieBasics);

    /**
     * 查询最新影视列表（按发布日期排序）
     *
     * @param movieBasics 影视基础信息
     * @return 影视基础信息集合
     */
    public List<MovieBasics> selectNewMovieList(MovieBasics movieBasics);

    /**
     * 查询推荐影视列表（随机推荐）
     *
     * @param movieBasics 影视基础信息
     * @return 影视基础信息集合
     */
    public List<MovieBasics> selectRecommendMovieList(MovieBasics movieBasics);

    /**
     * 根据采集来源和采集ID查询影视
     *
     * @param collectFrom 采集来源
     * @param collectId 采集ID
     * @return 影视基础信息
     */
    public MovieBasics selectMovieByCollectId(String collectFrom, String collectId);

    /**
     * 批量查询影视（根据采集ID列表）
     *
     * @param collectIds 采集ID列表
     * @return 影视基础信息集合
     */
    public List<MovieBasics> selectMoviesByCollectIds(@Param("collectIds") List<String> collectIds,@Param("siteFlag") String siteFlag);

    /**
     * 按采集来源删除影视
     *
     * @param collectFrom 采集来源
     * @return 删除的记录数
     */
    public int deleteMovieBasicsByCollectFrom(String collectFrom);

    // ========== 高级查询方法（搜索优化） ==========

    /**
     * 根据字段搜索影视ID列表（用于缓存）
     *
     * @param field 搜索字段(title/actors/directors/summary)
     * @param keyword 关键词
     * @return ID列表
     */
    public List<Integer> searchIdsByField(@Param("field") String field, @Param("keyword") String keyword);

    /**
     * 根据ID列表查询影视
     *
     * @param ids ID列表
     * @return 影视列表
     */
    public List<MovieBasics> selectMoviesByIds(@Param("ids") List<Integer> ids);

    /**
     * 高级筛选查询
     *
     * @param query 查询参数
     * @return 影视列表
     */
    public List<MovieBasics> filterMovies(MovieQueryDTO query);

    /**
     * 获取字母索引统计
     *
     * @param columnValue 栏目值
     * @return 字母统计Map
     */
    public List<Map<String, Object>> selectLetterStats(@Param("columnValue") String columnValue);

    /**
     * 获取年份列表
     *
     * @param columnValue 栏目值
     * @return 年份列表
     */
    public List<Integer> selectYearList(@Param("columnValue") String columnValue);

    /**
     * 获取相关推荐影视
     *
     * @param movieId 影视ID
     * @param genreId 类型ID
     * @param limit 数量限制
     * @return 相关影视列表
     */
    public List<MovieBasics> selectRelatedMovies(@Param("movieId") Integer movieId,
                                                  @Param("genreId") Integer genreId,
                                                  @Param("limit") int limit);

    /**
     * 更新首字母
     *
     * @param movieBasicsId 影视ID
     * @param letter 首字母
     * @return 结果
     */
    public int updateLetter(@Param("movieBasicsId") Integer movieBasicsId, @Param("letter") String letter);

    // ========== 去重查询方法 ==========

    /**
     * 查询影视基础信息列表（去重版本，按title+year去重）
     *
     * @param movieBasics 影视基础信息
     * @return 影视基础信息集合（去重后）
     */
    public List<MovieBasics> selectMovieBasicsListDistinct(MovieBasics movieBasics);

    /**
     * 获取首页推荐影视（去重版本，限制数量，按pub_date排序）
     *
     * @param columnValue 栏目值
     * @param limit 数量限制
     * @return 影视基础信息集合
     */
    public List<MovieBasics> selectHomeRecommendMovies(@Param("columnValue") String columnValue,
                                                       @Param("limit") int limit);

    // ========== 筛选条件查询方法 ==========

    /**
     * 获取所有不同的标签（tags）列表
     *
     * @param columnValue 栏目值（可选）
     * @return 标签列表
     */
    public List<String> selectDistinctTags(@Param("columnValue") String columnValue);

    /**
     * 获取所有不同的年份列表
     *
     * @param columnValue 栏目值（可选）
     * @return 年份列表
     */
    public List<Integer> selectDistinctYears(@Param("columnValue") String columnValue);

    /**
     * 获取所有不同的地区列表
     *
     * @param columnValue 栏目值（可选）
     * @return 地区列表
     */
    public List<String> selectDistinctAreas(@Param("columnValue") String columnValue);

    /**
     * 多字段搜索影视（去重版本）
     * 支持按片名、演员、导演、编剧、简介等字段搜索
     *
     * @param keyword 搜索关键词
     * @param columnValue 栏目值（可选，用于分类筛选）
     * @param status 状态（可选）
     * @return 影视列表（按title+year去重）
     */
    List<MovieBasics> searchMoviesDistinct(@Param("keyword") String keyword,
                                            @Param("columnValue") String columnValue,
                                            @Param("status") String status);
}
